第17章 数位分离
数位分离指把一个整数拆分成个位、十位、百位等单独数字,常用于数字反转、判断回文、统计数字和等题型。
17.1 核心原理
对于十进制数字:
num % 10→ 取出当前个位num / 10→ 去掉个位,缩小十倍 循环重复两步,直到数字变为0,即可取出全部数位(从低位到高位)。
17.2 基础代码:拆分正整数
#include <iostream>
using namespace std;
int main()
{
int num = 1234;
while(num > 0)
{
int d = num % 10;
cout << d << " ";
num = num / 10;
}
return 0;
}
// 输出:4 3 2 1
17.3 处理负数
负数直接取余可能出现负数位,先通过abs()转为正数再分离:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int num = -567;
int n = abs(num);
while(n > 0)
{
int d = n % 10;
cout << d << " ";
n /= 10;
}
return 0;
}
// 输出:7 6 5
17.4 按原始高位顺序保存
分离得到的数字是逆序,存入数组后逆序输出即可还原顺序:
#include <iostream>
using namespace std;
int main()
{
int num = 1234;
int dig[20], cnt = 0;
while(num > 0)
{
dig[cnt++] = num % 10;
num /= 10;
}
// 逆序打印
for(int i = cnt - 1; i >= 0; i--)
cout << dig[i] << " ";
return 0;
}
// 输出:1 2 3 4
17.5 常见应用场景
- 数字反转 依次取出个位,乘十累加得到新数字。 例:123 → 321
- 回文数判断 分离数位前后对比,正反数字相等即为回文(121、1331)。
- 数位求和 循环累加每一位,计算所有数字之和。 例:123 → 1+2+3=6
- 统计某数字出现次数 分离过程判断当前数位是否等于目标数字并计数。
17.6 重要注意事项
- 数字为0时要单独判断,否则循环不会执行;
- 先取余、再整除,顺序不可颠倒;
- 负数务必取绝对值,防止出现负数字;
- 超大数字使用
long long避免int溢出; - 分离结果默认低位先出,如需高位在前要借助数组逆序。